package org.batatasframework.support.definition;

import java.util.List;

import org.batatasframework.support.database.metadatas.TableMetadata;
import org.batatasframework.support.event.SearchableHttpRequest;
import org.batatasframework.support.searchable.FieldDisplayed;
import org.batatasframework.support.searchable.FieldQueryed;

import cn.bonoon.kernel.support.IOperator;

/**
 * <pre>
 * 统计对外提供的接口；
 * 每一种具体的类型都有自己的context，如：直接解析数据库表；解析定义文件；解析属性文件等。
 * 
 * <p>在创建的时候，可以对字段进行一些指定的操作，如：把某个整数的字段指定为下拉选择或可多选等
 * 注意，这些指定应该是一次性的，不应该在每次调用的时候指定，如果对同一个字段进行多次的指定，
 * 只有最后一次指定有效，如果同一个表在多个功能里，需要有不同的字段的指定，则如何？</p>
 * 
 * <p>这里还有一种情况，就是分表的情况，即可以使用一个上下文，来处理不同的表，而本次查询的用户可以访问哪一个表，
 * 需要通过某种方式来指定，如：通过{@link SearchableHttpRequest}来指定或通过过滤器来指定？</p>
 * 
 * <p>过滤器应该有两种，一种是全局的，也就是同一个上下文每一次查询处理的执行都需要被执行的过滤器
 * 另一种是暂时的，即在某个功能里才需要被执行的过滤器</p>
 * </pre>
 * 
 * <hr/>
 * 
 * <pre>
 * 一个查询统计集合的上下文的定义，必须有一个主表，这个主表可以关联到多个关联表；
 * 如果按定义来执行，则可以得到一个全面的临时表，这个临时表上的所有字段都是已经定义好的了。
 * 而这个上下文定义的作用，是可以通过这些字段的定义，在界面上提交自定义的选择，包括查询条件
 * 和返回的结果列表用户可以在这些定义的范围内任意的组合查询或统计。
 * </pre>
 * 
 * <pre>
 * TODO 这个定义包括了查询、查询条件、编辑等。。是不是太集中了？如果分开，那将会有很多个定义文件
 * </pre>
 * @author jackson
 *
 */
public interface TableDefinition extends TableDefinitionResource, TableMetadata{
	
	int undisplay = 1;
	int unquery = 2;
	
	/** 根据字段的名称，查找本表字段的定义 */
	FieldDefinition getDefinition(String fieldName);
	
	/** 根据字段定义的下标取对应的字段，字段定义的下标对应定义文件里的字段定义的顺序 */
	FieldDefinition getDefinition(int fieldIndex);
	
	/** 所有已定义的字段，注意这里会包括关联表字段的定义 */
	FieldDefinition[] getColumns();
	
	/** 查询选项的字段 */
	QueryDefinition query(String key);
	
	/** 定义文件里定义的用于查询的必要的字段 */
	List<ConditionDefinition> getConditions();
	
	/** 可用于排序的字段 */
	List<SortDefinition> getSorts();
	
	//以下是应用的时候调用的，这些方法可能需要处理一下
	List<FieldDisplayed> getGroups();

	List<FieldDisplayed> getDisplays();

	List<FieldQueryed> getQuerys(IOperator operator);
	
	List<JoinDefinition> getMustJoinTables();
}
